//
// Created by Lenovo on 2023/3/15.
//

/* Git 的基本使用 */

//分支改名：git branch -m 原分支名 新分支名

// git init 新建本地仓库
// 1.工作区 -> 暂存区             git add .
// 2.暂存区 -> 本地仓库           git commit -m "commit message 01"
// 3.查看状态                    git status
// 4.查看提交记录                 git log      git-log

// 5.版本回退
    //（1）软回退：撤销上 num 次的 commit，前面 commit 的所有文件回到 commit 之前的 add 状态
    //命令：git reset --soft HEAD~[num]    git reset --soft [版本号]
    //（2）混合回退：撤销上 num 次的 commit，同时撤销上 num 次的 add
    //命令：git reset --mixed HEAD~[num]   git reset --mixed [版本号]
    //（3）硬回退：撤销上 num 次的 commit，同时撤销上 num 次的 add，同时改变工作区中的文件，使之回到前 num 个版本
    //命令：git reset --hard HEAD~[num]    git reset --hard [版本号]

// 6.将本次 commit 合并到 HEAD 指向的提交并且可以修改注释(?)，产生新的版本号
    //命令：git commit --amend    进入 vim 修改

// 7.查看之前的操作                git reflog
// 8.查看分支                     git branch
// 9.创建并切换分支                git checkout -b 分支名

// 10.分支合并                    git merge 分支名
    //要先切换到目标分支上，再 merge 另一个分支
    //快进模式：如果 dev 和 master 同时指向一个提交，dev 又进行了一次提交，这个时候切换到 master 来 merge dev，Git 会直接把 master 移到 dev 所在位置，叫做 Fast_Forward
    // 合并两个不相干的分支: 加上 --allow-unrelated-histories

// 11.变基：设有两个分支 master 和 dev，master 上有 A -> B，dev 一开始指向 B，后来经历了两次提交 M -> N
// 与此同时 master 上也经历了一次提交 C，执行 rebase 操作(在 master 上)的结果就是：
// 原来：A -> B -> C        现在：A -> B -> M -> N -> C
//           |                            |               在执行的过程中要依次解决 C 和 M，C 和 N 的冲突问题
//           M -> N                      dev (可以删除)
//注意：如果反向变基的话，master 指向更早的提交，其中的内容不会包括后面的 M 和 N (可以快进合并)，同时再次提交 dev 又会出现分支
//命令：git rebase 分支名

// 12.配置 SSH 公钥
    //（1）生成 SSH 公钥：ssh-keygen -t rsa 不断回车
    //（2）获取公钥：cat ~/.ssh/id_rsa.pub
    //（3）验证是否配置成功：ssh -T git@gitee.com

// 13.远程仓库 - 先 git init
    //（1）添加远程仓库：git remote add <远端名称> <仓库路径>
        //远端名称默认是 origin
        //仓库路径就是远端服务器(gitee)的 SSH 地址
    //（2）查看远程仓库：git remote
    //（3）推送到远程仓库：git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名]]
        //如果远程分支名和本地分支名相同，则可以只写本地分支
        // -f：强制推送，强制覆盖
        // --set-upstream：推送到远端的同时建立起和远端分支的关联关系
        //如果当前分支已经和远端分支关联，则可以省略远端名和分支名：git push
        //命令：git branch -vv  查看本地分支和远端分支的关联关系
    //（4）从远程仓库克隆：git clone <仓库路径> [本地路径]
        //本地目录可以省略，会自动生成一个目录
    //（5）从远程仓库抓取和拉取：
        //抓取：将仓库里的更新都抓取到本地，不会进行合并
            //命令：git fetch [remote name] [branch name]
            //如果不指定远端名称和分支名，则抓取所有分支
        //拉取：将远端仓库里的更新都抓取到本地，并自动进行合并，等同于 fetch + merge
            //命令：git pull [remote name] [branch name]
            //如果不指定远端名称和分支名，则抓取并更新所有分支
        //区别：fetch 之后 HEAD -> master 指向之前的位置，pull 之后 HEAD -> master 指向最新的位置
    //（6）远程解决冲突：在同一时间，A，B 用户修改了同一个文件的同一行代码，此时会发生合并冲突
    // A 用户在本地修改代码后优先推送到远程仓库，B 用户晚了一步，推送的时候被拒绝
    // 此时 B 用户应该先 pull 拉取远程仓库，再解决冲突，最后 add commit push

